import { _decorator, Component, Node, input, Input, resources, Texture2D, Sprite, SpriteFrame, Vec2, director, UITransform, Rect } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('Block')
export class Block extends Component {
    public startIndex = new Vec2(0, 0); // 开始位置
    public nowIndex = new Vec2(0, 0); // 当前位置

    protected onLoad(): void {
        // 当前节点绑定输入触摸事件
        this.node.on(Input.EventType.TOUCH_START, this.onBlockTouch, this);
    }
    start() {
        // // 动态加载资源 - resources文件夹的相对路径，路径的结尾处不能包含文件扩展名。
        // resources.load('pic_1/texture', Texture2D, (err, texture)=>{
        //     if(err){
        //         console.log(err);
        //         return;
        //     }
        //     const sprite = this.getComponent(Sprite); // 获取当前绑定节点【脚本绑定在block节点】的2d精灵组件
        //     const spriteFrame = new SpriteFrame(); // 实例化精灵帧资源
        //     spriteFrame.texture = texture; // 贴图对象资源变为动态加载的贴图资源
        //     sprite.spriteFrame = spriteFrame; // 将block的Sprite组件的精灵帧赋值为动态加载贴图后的资源
        // })
    }

    update(deltaTime: number) {}

    protected onDestroy(): void {
        this.node.off(Input.EventType.TOUCH_START, this.onBlockTouch, this);
    }

    // block 触摸事件
    onBlockTouch() {
        // 当前位置坐标 通过全局自定义事件 click_pic 发射
        director.emit('click_pic', this.nowIndex);
    }

    /**
     * 拼图块 block 的初始化
     * @param {*}  texture(目标纹理)
     * @param {*}  blockSide(拼图块的边长)
     * @param {*}  index(拼图块的初始下标)
     * @returns
     */
    initBlock(texture, blockSide, index) {
        const uiTransform = this.getComponent(UITransform); // 获取当前节点的UITransform 组件
        uiTransform.setContentSize(blockSide, blockSide); // 设置节点的宽和长

        const sprite = this.getComponent(Sprite); // 获取当前节点的Sprite组件
        const spriteFrame = new SpriteFrame(); // 实例化精灵帧
        spriteFrame.texture = texture; // 精灵纹理绑定
        spriteFrame.rect = new Rect(index.x * blockSide, index.y * blockSide, blockSide, blockSide); // 获取 SpriteFrame 的纹理矩形区域，并赋值指定需要的纹理区域 Rect(x,y,width,height)【x,y分别标识读取的纹理的坐标起点; width,height分别是读取的纹理宽和高】
        sprite.spriteFrame = spriteFrame;

        this.nowIndex = index;
        this.startIndex = index;
    }
}
